package com.example.manage_dzensaas.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.example.manage_dzensaas.core.utils.StringUtils;
import com.example.manage_dzensaas.filter.exception.CustomException;
import com.example.manage_dzensaas.pojo.dto.ProductInfoExcelDTO;
import com.example.manage_dzensaas.pojo.entity.db1.ProductInfo;
import com.example.manage_dzensaas.service.ProductInfoService;
import org.noear.solon.annotation.Inject;
import org.noear.solon.data.annotation.Tran;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Excel文件读取监听器
 * 用于处理商品信息Excel文件的导入
 */
public class ProductInfoExcelListener implements ReadListener<ProductInfoExcelDTO> {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProductInfoExcelListener.class);

    /**
     * 批量处理的数据量
     */
    private static final int BATCH_COUNT = 100;

    /**
     * 缓存数据列表
     */
    private List<ProductInfo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * 商品信息服务
     */
    @Inject
    ProductInfoService productInfoService;

    /**
     * 构造函数
     * @param productInfoService 商品信息服务
     */
    private String addedBy;

    public ProductInfoExcelListener(ProductInfoService productInfoService, String addedBy) {
        this.productInfoService = productInfoService;
        this.addedBy = addedBy;
    }

    /**
     * 每读取一行数据时调用
     * @param dto 当前行数据
     * @param context 分析上下文
     */
    @Override
    public void invoke(ProductInfoExcelDTO dto, AnalysisContext context) {
        ProductInfo productInfo = new ProductInfo();

        boolean b = StringUtils.isNotBlank(dto.getSku());
        if (!b) {
            throw new CustomException("添加失败 " + dto.getSku() + " 有为空字段");
        }

        // 转换并设置字段
        if (StringUtils.isNotBlank(dto.getSku())) {
            productInfo.setSku(dto.getSku());
        } else {
            throw new CustomException("SKU不能为空");
        }
        if (StringUtils.isNotBlank(dto.getProductName())) {
            productInfo.setProductName(dto.getProductName());
        } else {
            productInfo.setProductName(null);
        }
        if (StringUtils.isNotBlank(dto.getFinalPrice())) {
            productInfo.setFinalPrice(new BigDecimal(dto.getFinalPrice()));
        } else {
            productInfo.setFinalPrice(null);
        }
        if (StringUtils.isNotBlank(dto.getSubsidyPrice())) {
            productInfo.setSubsidyPrice(new BigDecimal(dto.getSubsidyPrice()));
        } else {
            productInfo.setSubsidyPrice(null);
        }
        if (StringUtils.isNotBlank(dto.getOriginalPrice())) {
            productInfo.setOriginalPrice(new BigDecimal(dto.getOriginalPrice()));
        } else {
            productInfo.setOriginalPrice(null);
        }
        if (StringUtils.isNotBlank(dto.getStoreName())) {
            productInfo.setStoreName(dto.getStoreName());
        } else {
            productInfo.setStoreName(null);
        }
        if (StringUtils.isNotBlank(dto.getTagInfo())) {
            productInfo.setTagInfo(dto.getTagInfo());
        } else {
            productInfo.setTagInfo(null);
        }
        if (StringUtils.isNotBlank(dto.getImageUrl())) {
            productInfo.setImageUrl(dto.getImageUrl());
        } else {
            productInfo.setImageUrl(null);
        }
        if (StringUtils.isNotBlank(dto.getCommentCount())) {
            productInfo.setCommentCount(dto.getCommentCount());
        } else {
            productInfo.setCommentCount(null);
        }
        // 设置默认值
        productInfo.setAddedTime(new Date());
        productInfo.setCreatedTime(new Date());
        productInfo.setUpdatedTime(new Date());
        productInfo.setAddedBy(this.addedBy);
        
        cachedDataList.add(productInfo);
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成后调用
     * @param context 分析上下文
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData();
        LOGGER.info("Excel解析完成");
    }

    /**
     * 保存数据到数据库
     */
    @Tran
    private void saveData()  {
        if (!cachedDataList.isEmpty()) {
            productInfoService.batchInsertOrUpdate(new ArrayList<>(cachedDataList));
        }
    }
}
